
// 变量中
// let fn = function(){
//     console.log(123)
// }
// fn()
//=========================================================

// 返回值
// let createFn = function(){
//     const str = 'hello' 
//     return function(){
//         console.log(str)
//     }
// } 
// createFn()()
//=========================================================

// 高阶函数 函数当参数
const arr = [10,32,3,53,65,10,34,24,10]
// // 实现forEach
// function forEach(array, fn){
//     for (let index = 0; index < array.length; index++) {
//         fn(array[index])
//     }
// }
// forEach(arr,function(item){
//     console.log(item)
// })

// // 实现filter
// function filter(array, fn){
//     const results = [];
//     for (const value of array) {
//         if(fn(value)){
//             results.push(value)
//         }
//     }
//     return results
// }
// console.log(filter(arr,e=>e%2===0))

// // 实现map
// function map(array,fn){
//     let results = [];
//     for (const value of array) {
//         results.push(fn(value))
//     }
//     return results
// }
// console.log(map(arr,e=>e*2))

// // 实现every
// function every(array, fn){
//     let result = true;
//     for (const value of array) {
//         result = fn(value)
//         if(!result){
//             break
//         }
//     }
//     return result
// }
// console.log(every(arr,e=>e>2))

// // 实现 some
// function some(array, fn){
//     let results = false;
//     for (const value of array) {
//         results = fn(value);
//         if(results) break;
//     }
//     return results
// }
// console.log(some(arr, e=>e>100))

// 实现find
// function find(array,fn){
//     let result = null;
//     for (const value of array) {
//         if(fn(value)){
//             result = value;
//             break
//         }
//     }
//     return result
// }
// console.log(find(arr, e=>e===10))

// 实现findIndex
// function find(array,fn){
//     let result = [];
//     for (let index = 0; index < array.length; index++) {
//         if(fn(array[index])) result.push(index)
//     }
//     return result
// }
// console.log(find(arr, e=>e===10))
//=========================================================

// 高阶函数 函数当返回值
// const arr2 = [1,2,3,4,5,6,7,8]
// // // 实现once 只调用一次
// function once(fn){
//     let done = false
//     return function(){
//         if(!done){
//             done = true;
//             return fn.apply(fn,arguments)
//         }
//     }
        
// }
// const fn2 = once(function(money){
//     console.log('money',money)
// });
// console.log('fn2',fn2)
// fn2(111)
// fn2(222)
// fn2(333)
// fn2(444)
// fn2(55)

//=========================================================

// 闭包
// console.log(Math.pow(2,2))
// console.log(Math.pow(2,5))

// function pow(p){
//     return function(num){
//         return Math.pow(num,p)
//     }
// }

// const pow2 = pow(2)
// const pow4 = pow(4)

// console.log(pow2(4))
// console.log(pow4(2))

const _ = require('lodash')

// 模拟memoize
function memoize(fn){
    let cache = {};
    return function(){
        let arg_str = JSON.stringify(arguments)
        console.log("arg_str",arg_str,cache,arguments)
        cache[arg_str] = cache[arg_str] || fn.apply(fn,arguments)
        return cache[arg_str]
    }
}

function getArea(r){
    return Math.PI * r * r;
}
// const getAreaWithMemory = _.memoize(getArea)
const getAreaWithMemory = memoize(getArea)
console.log(getAreaWithMemory(3))
console.log(getAreaWithMemory(3))
console.log(getAreaWithMemory(4))
console.log(getAreaWithMemory(5))
console.log(getAreaWithMemory(5))
console.log(getAreaWithMemory(4))
console.log(getAreaWithMemory(3))



